package com.qianli.cashmama.product.facade;

import com.fqgj.common.api.Response;
import com.qianli.cashmama.product.facade.result.*;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * Created by xuyang on 2017/7/20.
 */
public interface ProductFacade {
    /**
     * 根据app的编码获取产品类目列表
     *
     * @param appCode app的编码
     * @return
     */
    Response<List<ProductCategory>> getProductCategoryList(String appCode);

    /**
     * 根据categoryCode获取认证信息
     */
    Response<CategoryAuthRef> getUserAuthByCategoryCode(String categoryCode);

    /**
     * 获取所有的认证信息
     */
    Response<Map<String, UserAuth>> getAllUserAuth();


    /**
     * 查询结果中包含active = true 和false 的产品
     *
     * @param productCategoryCode 产品类目编码
     * @param selectRules         true product和productCategory中包含规则, false product和productCategory中不包含规则
     * @return
     */
    Response<List<Product>> getProductList(String productCategoryCode, boolean selectRules);

    /**
     * 根据产品类目、金额、期数查询产品
     *
     * @param productCategoryCode
     * @param principalMoney
     * @param period
     * @return
     */
    Response<Product> getProductByPrincipalMoneyAndPeriod(String productCategoryCode, BigDecimal principalMoney, Integer period);

    /**
     * 根据商户号、金额、期限查询产品
     * @param merchantCode
     * @param principalMoney
     * @param period
     * @return
     */
    Response<Product> getProductByMerchantCodeAndPrincipalMoneyAndPeriod(String merchantCode, BigDecimal principalMoney, Integer period);

    /**
     * 查询结果中只包含active=true的产品 默认返回shelfType=1的产品
     *
     * @param productCategoryCode
     * @param selectRules
     * @return
     */
    Response<List<Product>> getActiveProductList(String productCategoryCode, boolean selectRules);

    /**
     * 查询结果中只包含active=true的产品
     *
     * @param productCategoryCode
     * @param selectRules
     * @param shelfType
     * @return
     */
    Response<List<Product>> getActiveProductList(String productCategoryCode, boolean selectRules, Integer shelfType);

    /**
     * 查询产品，调用方需要根据active的值判断产品当前是否可用
     *
     * @param productCode 产品类目编码
     * @param selectRules true product中包含规则, false product中不包含规则
     * @return
     */
    Response<Product> getProductDetail(String productCode, boolean selectRules);

    /**
     * @param productCodeList
     * @param selectRules
     * @return
     */
    Response<List<Product>> getProductListDetail(List<String> productCodeList, boolean selectRules);

    /***
     * 获取所有生效中的产品类目
     * @return
     */
    Response<List<ProductCategory>> getAllActiveProductCategory();

    /**
     * 根据产品类目code获取产品类目信息，不包含规则
     *
     * @param productCategoryCode
     * @return
     */
    Response<ProductCategory> getCategoryByCode(String productCategoryCode);

    /**
     * 产品相关的资源配置:
     * typeCode :
     * bank-银行相关配置，
     * authStatus-认证状态相关配置，
     * billStatusForwardUrl-账单页面相关URL
     */
    Response<List<ConfigResource>> getResource(String typeCode);


    /**
     * 根据商户id获取对应的类目列表
     *
     * @param merchantCode
     * @return
     */
    Response<List<ProductCategory>> getProductCategoriesByMerchantCode(String merchantCode);

    /**
     * 查询所以产品类目
     *
     * @return
     */
    Response<List<ProductCategory>> getAllProductCategory();


    /**
     * 根据商户号查询产品信息
     *
     * @param merchantCode
     * @return
     */
    Response<List<Product>> getProductByMerchantCode(String merchantCode);


    /**
     * 根据产品类目、到账金额、期数查询产品
     * @param productCategoryCode
     * @param arrivalMoney
     * @param period
     * @return
     */
    Response<Product> getProductByArrivalMoneyAndPeriod(String productCategoryCode, BigDecimal arrivalMoney, Integer period);

    /**
     * 根据产品类目、到账金额、期数查询产品
     * @param productCategoryCode
     * @param arrivalMoney
     * @param period
     * @param shelfType
     * @return
     */
    Response<Product> getProductByArrivalMoneyAndPeriod(String productCategoryCode, BigDecimal arrivalMoney, Integer period, Integer shelfType);

    Response updateProductCategoryByCode(ProductCategory productCategory);

    void  addProductCategory(ProductCategory productCategory);
}
